package com.kamistoat.meimeistore.commonsecurity.config;

import com.kamistoat.meimeistore.commonsecurity.interceptor.TokenInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 拦截器配置.
 * WebMvcConfigurer 是老朋友了，在商城项目中我们也是使用该类来为路径添加拦截器
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    /**
     * 不需要进行拦截的地址
     */
    public static final String[] excludeUrls = {"/login", "/logout", "/refresh"};

    /**
     * 为了防止拦截器没有被Spring容器管理，因此提前将其制作成Bean注入到容器中
     * @return
     */
    @Bean
    public HandlerInterceptor getTokenInterceptor() {
        return new TokenInterceptor();
    }


    /**
     * 添加拦截器.对除了 excludeUrls中的路径之外的所有路径进行拦截.
     * 特别注意，之前的项目中都是使用 addInterceptor(new TokenInterceptor())，这会导致如果在TokenInterceptor中还存在Autowired的类，那么将全变成null。
     * 原因也很简单，因为这里直接new出来的TokenInterceptor压根不会被容器管理。
     *
     * 解决的办法就是提前将 TokenInterceptor制作成Bean存入容器中，这里使用@Bean或者使用@Autowired都可以
     *
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(getTokenInterceptor())
                .addPathPatterns("/**")
                .excludePathPatterns(excludeUrls)
                .order(-10);
    }
}
